package sintatico;

public class Sintatico {
	
	private String token;
	private String categoria;
	private int linha;

	
	public void nextToken() {
		token = "teste";
		categoria = "seila";
		linha = 0;
	}
	
	public boolean primeiro(String nao_terminal, String token, String categoria) {
		
		//2
		if (nao_terminal.equals("declaracoes")) 
			return primeiro("decl_local_global",token,categoria);
		//3
		if (nao_terminal.equals("decl_local_global")) 
			return (primeiro("declaracao_local",token,categoria) || primeiro("declaracao_global",token,categoria));
		//4
		if (nao_terminal.equals("declaracao_local") && (token.equals("declare") || token.equals("constante") || token.equals("tipo")))
			return true;
		//5
		if (nao_terminal.equals("variavel") && categoria.equals("IDENT"))
			return true;
		//6
		if (nao_terminal.equals("mais_var") && token.equals(","))
			return true;
		//7
		if (nao_terminal.equals("identificador"))
			return primeiro("ponteiros_opcionais",token,categoria);
		//8
		if (nao_terminal.equals("ponteiros_opcionais") && token.equals("^"))
			return true;
		//9
		if (nao_terminal.equals("outros_ident") && token.equals("."))
			return true;
		//10
		if (nao_terminal.equals("dimensao") && token.equals("["))
			return true;
		//11
		if (nao_terminal.equals("tipo"))
			return (primeiro("registro",token,categoria) || primeiro("tipo_estendido",token,categoria));
		//12
		if (nao_terminal.equals("mais_ident") && token.equals(","))
			return true;
		//13
		if (nao_terminal.equals("mais_variaveis"))
			return primeiro("variavel",token,categoria);
		//14
		if (nao_terminal.equals("tipo_basico") && (token.equals("literal") || token.equals("inteiro") || token.equals("real") || token.equals("logico")))
			return true;
		//15
		if (nao_terminal.equals("tipo_basico_ident"))
			if (categoria.equals("IDENT")) return true;
			else return primeiro("tipo_basico",token,categoria);
		//16
		if (nao_terminal.equals("tipo_estendido"))
			return primeiro("tipo_opcional",token,categoria);
		//17
		if (nao_terminal.equals("valor_constante") && (categoria.equals("CADEIA") || categoria.equals("NUM_INT") || categoria.equals("NUM_REAL") || token.equals("verdadeiro") || token.equals("falso")))
			return true;
		//18
		if (nao_terminal.equals("registro") && token.equals("registro"))
			return true;
		//19
		if (nao_terminal.equals("declaracao_global") && (token.equals("procedimento") || token.equals("funcao")))
			return true;
		//20
		if (nao_terminal.equals("parametros_opcionais"))
			return primeiro("parametro",token,categoria);
		//21
		if (nao_terminal.equals("parametro"))
			return primeiro("var_opcional",token,categoria);
		//22
		if (nao_terminal.equals("var_opcional") && token.equals("var"))
			return true;
		//23
		if (nao_terminal.equals("mais_parametros") && token.equals(","))
			return true;
		//24
		if (nao_terminal.equals("declaracoes_locais"))
			return primeiro("declaracao_local",token,categoria);
		//25
		if (nao_terminal.equals("corpo"))
			return primeiro("declaracoes_locais",token,categoria);
		//26
		if (nao_terminal.equals("comandos"))
			return primeiro("cmd",token,categoria);
		//27
		if (nao_terminal.equals("cmd") && (token.equals("leia") || token.equals("escreva") || token.equals("se") || token.equals("caso") || token.equals("para") || token.equals("enquanto") || token.equals("faca") || token.equals("^") || categoria.equals("IDENT") || token.equals("retorne")))
			return true;
		//28
		if (nao_terminal.equals("mais_expressao") && token.equals(","))
			return true;
		//29
		if (nao_terminal.equals("senao_opcional") && token.equals("senao"))
			return true;
		//30
		if (nao_terminal.equals("chamada_atribuicao") && token.equals("("))
			return true;
		//31
		if (nao_terminal.equals("argumentos_opcional"))
			return primeiro("expressao",token,categoria);
		//32
		if (nao_terminal.equals("selecao"))
			return primeiro("constantes",token,categoria);
		//33
		if (nao_terminal.equals("mais_selecao"))
			return primeiro("selecao",token,categoria);
		//34
		if (nao_terminal.equals("constantes"))
			return primeiro("numero_intervalo",token,categoria);
		//35
		if (nao_terminal.equals("mais_constantes") && token.equals(","))
			return true;
		//36
		if (nao_terminal.equals("numero_intervalo"))
			return primeiro("op_unario",token,categoria);
		//37
		if (nao_terminal.equals("intervalo_opcional") && token.equals(".."))
			return true;
		//38
		if (nao_terminal.equals("op_unario") && token.equals("-"))
			return true;
		//39
		if (nao_terminal.equals("exp_aritmetica"))
			return primeiro("termo",token,categoria);
		//40
		if (nao_terminal.equals("op_multiplicacao") && (token.equals("*") || token.equals("/")))
			return true;
		//41
		if (nao_terminal.equals("op_adicao") && (token.equals("+") || token.equals("-")))
			return true;
		//42
		if (nao_terminal.equals("termo"))
			return primeiro("fator",token,categoria);
		//43
		if (nao_terminal.equals("outros_termos"))
			return primeiro("op_adicao",token,categoria);
		//44
		if (nao_terminal.equals("fator"))
			return primeiro("parcela",token,categoria);
		//45
		if (nao_terminal.equals("outros_fatores"))
			return primeiro("op_multiplicacao",token,categoria);
		//46
		if (nao_terminal.equals("parcela"))
			return (primeiro("op_unario",token,categoria) || primeiro("parcela_nao_unario",token,categoria));
		//47
		if (nao_terminal.equals("parcela_unario") && (token.equals("^") || categoria.equals("IDENT") || categoria.equals("NUM_INT") || categoria.equals("NUM_REAL") || token.equals("(")))
			return true;
		//48
		if (nao_terminal.equals("parcela_nao_unario") && (token.equals("&") || categoria.equals("CADEIA")))
			return true;
		//49
		if (nao_terminal.equals("outras_parcelas") && token.equals("%"))
			return true;
		//50
		if (nao_terminal.equals("chamada_partes"))
			if (token.equals("(")) return true;
			else return primeiro("outros_ident",token,categoria);
		//51
		if (nao_terminal.equals("exp_relacional"))
			return primeiro("exp_aritmetica",token,categoria);
		//52
		if (nao_terminal.equals("op_opcional"))
			return primeiro("op_relacional",token,categoria);
		//53
		if (nao_terminal.equals("op_relacional") && (token.equals("=") || token.equals("<>") || token.equals(">=") || token.equals("<=") || token.equals(">") || token.equals("<")))
			return true;
		//54
		if (nao_terminal.equals("expressao"))
			return primeiro("termo_logico",token,categoria);
		//55
		if (nao_terminal.equals("op_nao") && token.equals("nao"))
			return true;
		//56
		if (nao_terminal.equals("termo_logico"))
			return primeiro("fator_logico",token,categoria);
		//57
		if (nao_terminal.equals("outros_termos_logicos") && token.equals("ou"))
			return true;
		//58
		if (nao_terminal.equals("outros_fatores_logicos") && token.equals("e"))
			return true;
		//59
		if (nao_terminal.equals("fator_logico"))
			return primeiro("op_nao",token,categoria);
		//60
		if (nao_terminal.equals("parcela_logica"))
			if (token.equals("verdadeiro") || token.equals("falso")) return true;
			else return primeiro("exp_relacional",token,categoria);
		
		return false;
	}
    
	public void programa() {
		
		while (primeiro("declaracao_local",token,categoria) || primeiro("declaracao_global",token,categoria)) {
			if (primeiro("declaracao_local",token,categoria))
				declaracao_local();
			else
				declaracao_global();
		}
		if (token.equals("algoritmo"))
			nextToken();
		else
			erro(token,linha);
		corpo();
		if (token.equals("fim_algoritmo"))
			nextToken();
		else
			erro(token,linha);
	}
	
	public void erro(String token, int linha) {
		// TODO Auto-generated method stub
		
	}

	public void corpo() {
		// TODO Auto-generated method stub
		
	}

	public void declaracao_global() {
		// TODO Auto-generated method stub
		
	}

	public void declaracao_local() {
		// TODO Auto-generated method stub
		
	}

	public static void main(String[] args) {
		System.out.println("teste");
	}
}